/*
 * HighTest.h
 *
 * Created on : 24-05-2014
 *     Author : A.W. Janisse
 *
 * Version 1.0: 24-05-2014, Final release
 */

#include "gtest/gtest.h"

#include "High.h"
#include "Low.h"
#include "And.h"

/**
 * Deze test toon aan dat er het object aangemaakt en opgeruimd (delete) kan
 * worden.
 *
 * De test case is geslaag als de instantie van and niet NULL is en er geen runtime
 * error komen.
 */
TEST(HIGH, ConstructorDestructorTest)
{
    High *highGate = new High(0,0,"High");
    ASSERT_TRUE(highGate != NULL);
    delete highGate;
}

/**
 * Deze test toon aan dat de logische HIGH functie het juiste reslutaat geeft.
 */
TEST(HIGH, GetOutputWorksOK)
{
    High *highGate = new High(10, 20, "High");

    EXPECT_EQ(true, highGate->getOutputValue());

    delete highGate;
}

/**
 * Deze test controleert of de HIGH gate de juiste drawing instruction levert. De drawing instruction is
 * een string waarin informatie staat over de gate zelf. In de opbouw van de string wordt rekening
 * gehouden met de logische toestand van de gate. Een HIGH gate heeft nooit ingangen.
 */
TEST(HIGH, GetDrawingInstructions)
{
    // Low is used to reset numbering
    Low *l1 = new Low(0,0,"Low");
    l1->resetNextNumber();

    Gate * g1 = new High(10, 20, "High");
    EXPECT_EQ("gate,1,High,10,20,0,L,L,H\n", g1->getDrawingInstruction());

    Gate * g2 = new High(40, 50, "High");
    EXPECT_EQ("gate,2,High,40,50,0,L,L,H\n", g2->getDrawingInstruction());

    delete l1;
    delete g1;
    delete g2;
}
